package com.winit.config.service;

import com.winit.config.model.Config;

import java.util.Map;

public interface IConfigService {
    /**
     * @param id         若传了id则为更新操作，对于更新操作，{{！！！！！！！！各参数除了kChangeMap外}}，若不为NULL则更新为指定值，
     *                   值为空Collection则清除原记录中的对应值。对于kChangeMap，若不为NULL则为合并操作，将原记录中的kChangeMap与所传的Map进行合并，
     *                   传入的kChangeMap优先级更高。
     * @param parentId
     * @param kvMap
     * @param kRefMap
     * @param kChangeMap
     * @return
     */
    Config saveConfig(String id, String parentId, Map<String, String> kvMap, Map<String, String> kRefMap, Map<String, String> kChangeMap);

    /**
     * 这个方法与
     * saveConfig(String id, String parentId, Map<String, String> kvMap, Map<String, String> kRefMap, Map<String, String>kChangeMap)
     * 含义相同
     *
     * @param config
     * @return
     */
    Config saveConfig(Config config);

    Config saveConfig(Config config, boolean isMerge);

//    Map<String, String> merge(Map<String, String> kvMap1, Map<String, String> kvMap2, Map<String, String> kChangeMap);
//
//    /**
//     * 根据kRefMap将kvMap render出来
//     * @param kvMap
//     * @param kRefMap
//     */
//    void render(Map<String, String> kvMap, Map<String, String> kRefMap);

    /**
     * 根据id获取vkMap
     *
     * @param id
     * @param rawConfig true时只返回数据库中根据id查出的当前记录，不做任何处理；
     *                  为false时查出当前记录与所有上级记录，合并，返回的结果已进行render；
     * @return
     */
    Config getConfigMap(String id, boolean rawConfig) throws Exception;

    Integer deleteConfigById(String id);

    /**
     * 将priorityId对应的config merge进destId对应的config中保存，将priorityId对应的config不变：
     * 1.如果对应destId的config_dest不存在，priority对应的config_pri存在，那么复制config_pri新建config_dest(id 为destId)；
     * 2.如果对应destId的config_dest存在,priority对应的config_pri不存在，不进行操作直接返回；
     * 3.如果对应destId的config_dest不存在,priority对应的config_pri不存在，不进行操作直接返回；
     * 4.如果两均存在，正常执行合并并保存操作
     * @param priorityId
     * @param destId
     * @param raw  是否先render, merge(sub-parent)再进行merge
     */
    void mergeConfigById(String priorityId, String destId, boolean raw) throws Exception;
}
